﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Data.OleDb;
using System.Data;
using GAIA_Logica;
using System.IO;

namespace GAIA_IU
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        private string realPhysicalPath;
        private List<Terreno> listaTerrenos = new List<Terreno>();
        private Terreno terreno = new Terreno();
        private Estudio estudio;

        protected void Page_Load(object sender, EventArgs e)
        {
            bool login = Session["login"] != null ? Boolean.Parse(Session["login"].ToString()) : false;

            if (login)
            {

                if (IsPostBack)
                {

                }
                else
                {
                    Session["codigo_cliente"] = Request["idCliente"];
                }
            }
            else
            {
                Response.Redirect("Login.aspx");
            }
        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            if (FileUpload1.HasFile)
                try
                {
                    string fileExt = System.IO.Path.GetExtension(FileUpload1.FileName);
                    //realPhysicalPath = System.IO.Path.GetDirectoryName(FileUpload1.FileName);

                    string root = Server.MapPath("~");
                    string parent = System.IO.Path.GetDirectoryName(root);
                    string gparent = System.IO.Path.GetDirectoryName(parent);
                    /*realPhysicalPath = System.IO.Path.GetDirectoryName(gparent);
                    realPhysicalPath = realPhysicalPath + "\\newExcelFile" + fileExt;*/
                    realPhysicalPath = System.IO.Path.GetDirectoryName(root);
                    realPhysicalPath = realPhysicalPath + "\\gaia\\Resources\\newExcelFile" + fileExt;

                    FileUpload1.SaveAs(realPhysicalPath);

                    Label1.Text = "Nombre de documento: " +
                         FileUpload1.PostedFile.FileName + "<br>" +
                         FileUpload1.PostedFile.ContentLength + " kb<br>" +
                         "Tipo de contenido: " +
                         FileUpload1.PostedFile.ContentType;

                    readNewFileCSV();
                }
                catch (Exception ex)
                {
                    Label1.Text = "ERROR: " + ex.Message.ToString() + "\n Path: " + realPhysicalPath;
                }
            else
            {
                Label1.Text = "Especifique un documento.";
            }

        }

        private void readNewFile()
        {
            /*string connString = ConfigurationManager.ConnectionStrings["xls"].ConnectionString;
            // Create the connection object
            OleDbConnection oledbConn = new OleDbConnection(connString);*/

            //OleDbConnection oledbConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + realPhysicalPath + "';Extended Properties=Excel 12.0;"); 
            OleDbConnection oledbConn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + realPhysicalPath + "';Extended Properties=Excel 12.0 Macro;");
            try
            {
                // Open connection
                oledbConn.Open();

                // Create OleDbCommand object and select data from worksheet Sheet1
                OleDbCommand cmd = new OleDbCommand("SELECT * FROM [CensoTerrenoUp$]", oledbConn);

                // Create new OleDbDataAdapter
                OleDbDataAdapter oleda = new OleDbDataAdapter();

                oleda.SelectCommand = cmd;

                // Create a DataSet which will hold the data extracted from the worksheet.
                DataSet ds = new DataSet();

                // Fill the DataSet from the data extracted from the worksheet.
                oleda.Fill(ds, "CensoInventarioTerreno");

                // Bind the data to the GridView
                GridView1.DataSource = ds.Tables[0].DefaultView;
                GridView1.DataBind();
                procesarInventario(ds);
            }
            catch (Exception ex)
            {

            }
            finally
            {
                // Close connection
                oledbConn.Close();
            }
        }

        private void readNewFileCSV()
        {

            try
            {
                List<string[]> parsedData = new List<string[]>();

                using (StreamReader readFile = new StreamReader(realPhysicalPath))
                {
                    string line;
                    string[] row;
                    bool filaVacia = false;

                    while ((line = readFile.ReadLine()) != null && filaVacia==false)
                    {
                        row = line.Split(',');
                        if (row[0] == null || row[0] == "")
                        {
                            filaVacia = true;
                        }
                        else
                        {
                            parsedData.Add(row);                        
                        }
                    }
                }

                DataTable dt = new DataTable();

                string[] columnas = { "Especie", "DAP", "HC", "TipoTerreno", "LambertN", "LambertE" };

                foreach (string column in columnas)
                {
                    dt.Columns.Add(column);
                }

                foreach (string[] row in parsedData)
                {
                    dt.Rows.Add(row);
                }

                // Bind the data to the GridView
                GridView1.DataSource = dt;
                GridView1.DataBind();
                procesarInventarioCSV(dt);
            }
            catch (Exception ex)
            {
                Label1.Text = "ERROR: " + ex.Message.ToString() + "<br>" +
                              "Path: " + realPhysicalPath + "<br>"/* +
                              "Connection: " + ExcelConnection*/;
            }
        }

        private void procesarInventario(DataSet ds)
        {

            string id_cliente = (String)Session["codigo_cliente"];
            int id_parcela = (Int32)Session["id_segemento"];

            estudio = new Estudio(id_cliente, id_parcela);
            estudio.ingrearEstudio();

            DataTable dt = ds.Tables[0];

            foreach (DataRow dr in dt.Rows)
            {
                Elemento nuevoElemento = new Elemento();
                nuevoElemento.IdEspecie = int.Parse(dr["Especie"].ToString());
                nuevoElemento.Dap = double.Parse(dr["DAP"].ToString());
                nuevoElemento.Hc = double.Parse(dr["HC"].ToString());
                nuevoElemento.LambertN = double.Parse(dr["LambertN"].ToString());
                nuevoElemento.LambertE = double.Parse(dr["LambertE"].ToString());
                nuevoElemento.TipoTerreno = dr["TipoTerreno"].ToString();

                //Calcular Volumen y Area Basal
                Especies especie = new Especies();
                especie = especie.buscarEspecieId(nuevoElemento.IdEspecie);

                nuevoElemento.Volumen = Calculos.getVolumenTotal(nuevoElemento.Dap, nuevoElemento.Hc, especie.NumFormula);
                nuevoElemento.AreaBasal = Calculos.getAreaBasal(nuevoElemento.Dap, nuevoElemento.Hc);

                nuevoElemento.LambertE = Calculos.getMinDec(nuevoElemento.LambertE);
                nuevoElemento.LambertN = Calculos.getMinDec(nuevoElemento.LambertN);

                nuevoElemento.Crtm05N = Calculos.getCrmt05N(nuevoElemento.LambertN, nuevoElemento.LambertE);
                nuevoElemento.Crtm05E = Calculos.getCrmt05E(nuevoElemento.LambertN, nuevoElemento.LambertE);

                nuevoElemento.IdCenso = estudio.CodEstudio;

                bool result = nuevoElemento.ingresaElemento();
            }
        }

        private void procesarInventarioCSV(DataTable dt)
        {

            string id_cliente = (String)Session["codigo_cliente"];
            int id_parcela = (Int32)Session["id_segemento"];

            estudio = new Estudio(id_cliente, id_parcela);
            estudio.ingrearEstudio();


            foreach (DataRow dr in dt.Rows)
            {
                Elemento nuevoElemento = new Elemento();
                nuevoElemento.IdEspecie = int.Parse(dr["Especie"].ToString());
                nuevoElemento.Dap = double.Parse(dr["DAP"].ToString());
                nuevoElemento.Hc = double.Parse(dr["HC"].ToString());
                nuevoElemento.LambertN = double.Parse(dr["LambertN"].ToString());
                nuevoElemento.LambertE = double.Parse(dr["LambertE"].ToString());
                nuevoElemento.TipoTerreno = dr["TipoTerreno"].ToString();

                //Calcular Volumen y Area Basal
                Especies especie = new Especies();
                especie = especie.buscarEspecieId(nuevoElemento.IdEspecie);

                nuevoElemento.Volumen = Calculos.getVolumenTotal(nuevoElemento.Dap, nuevoElemento.Hc, especie.NumFormula);
                nuevoElemento.AreaBasal = Calculos.getAreaBasal(nuevoElemento.Dap, nuevoElemento.Hc);

                nuevoElemento.LambertE = Calculos.getMinDec(nuevoElemento.LambertE);
                nuevoElemento.LambertN = Calculos.getMinDec(nuevoElemento.LambertN);

                nuevoElemento.Crtm05N = Calculos.getCrmt05N(nuevoElemento.LambertN, nuevoElemento.LambertE);
                nuevoElemento.Crtm05E = Calculos.getCrmt05E(nuevoElemento.LambertN, nuevoElemento.LambertE);

                nuevoElemento.IdCenso = estudio.CodEstudio;

                bool result = nuevoElemento.ingresaElemento();
            }
        }

        protected void verExcel_btn_Click(object sender, EventArgs e)
        {
            readNewFile();
        }

        protected void btn_busqueda_Click(object sender, EventArgs e)
        {
            string param_option = tipo_busqueda.SelectedValue;
            string param = txt_busqueda.Text;
            Terreno terrenoTemp = new Terreno(); ;
            try
            {
                switch (param_option)
                {
                    case "nombre":
                        listaTerrenos = terrenoTemp.buscarXNombre(param);
                        break;
                    case "id":
                        terrenoTemp.getTerreno(int.Parse(param));
                        listaTerrenos.Add(terrenoTemp);
                        break;
                }
                cargarDatos();
                GridView_Parcelas.DataSource = null;
                GridView_Parcelas.DataBind();
                GridView_Parcelas.CssClass = "unloaded";
                /*xxxxx*/
            }
            catch (Exception ex)
            {
                Avisar("Error al buscar al cliente. Por favor intente nuevamente. (" + ex.Message + ")", false);
            }
        }

        protected void Avisar(string aviso, bool resultado)
        {
            aviso_label.Text = aviso;
            if (resultado)
            {
                aviso_label.CssClass = "_true";
            }
            else
            {
                aviso_label.CssClass = "_false";
            }

        }

        protected void cargarDatos()
        {
            GridView_Terrenos.DataSource = listaTerrenos;
            GridView_Terrenos.DataBind();
            Session["ListaDeTerrenos"] = listaTerrenos;
        }

        protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView_Terrenos.DataSource = (List<Terreno>)Session["ListaDeTerrenos"];
            GridView_Terrenos.PageIndex = e.NewPageIndex;
            GridView_Terrenos.DataBind();
        }

        protected void GridView_Terrenos_SelectedIndexChanged(object sender, EventArgs e)
        {
            int id_terreno = (Int32)GridView_Terrenos.SelectedDataKey.Values["Id"];
            string nombre_terreno = (String)GridView_Terrenos.SelectedDataKey.Values["Nombre"];
            List<Segmento> listaParcelas = new List<Segmento>();
            Segmento tmp_parcela = new Segmento();
            listaParcelas = tmp_parcela.getListaSegmentosTerreno(id_terreno);
            GridView_Parcelas.DataSource = listaParcelas;
            GridView_Parcelas.DataBind();
        }

        protected void GridView_Parcelas_SelectedIndexChanged(object sender, EventArgs e)
        {
            Session["id_segemento"] = (Int32)GridView_Parcelas.SelectedDataKey.Values["Id"];
        }
    }
}